/*
 * Personaje.h
 *
 *  Created on: 01/09/2012
 *      Author: rodrigo
 */

#ifndef PERSONAJE_H_
#define PERSONAJE_H_
#include <string>
#include <vector>

#include "../ObjetoMovible.h"
#include "../../../Modelo/Nivel/Nivel.h"

#define DEFAULT_PERSONAJE "../Resources/default_personaje.bmp"
#define SIN_IMAGEN -1

using namespace std;

class EstadoPersonaje {
	
	public: 
	static const int SubiendoEscalera;
	static const int SinParticular;
	static const int AgarrandoEstrellaInvencibilidad;
	static const int Volando;
	static const int Muriendo;
	static const int Gano;
	static const int Perdio;
		
	static const vector<int> acciones;
	static const vector<int> animaciones;
	static const vector<int> accionesParticulares;
	static const vector<string> descripcionAcciones;
	static const vector<string> descripcionAccionesParticulares;
	
};

class SonidosPersonaje {
	
	public:
	static const int Colision;
	static const int Salto;
	static const int Invencibilidad;
	static const int ColisionObstaculo;
	static const int RescatePrincesa;
	static const int Size;
	
	static const vector<string> descripcionSonidos;
};

class Personaje: public ObjetoMovible {

protected:

	EstadoMovimiento estadoArriba;
	EstadoMovimiento estadoAbajo;
	
	int estadoParticular;
	int estadoBonus;
	int puntaje;
	int alturaEscalera;
	int margenScroll;
	int vidas;
	bool armadura;
	pair<bool, Uint32> invencibilidad;
	pair<bool, Uint32> volatil;
	int alturaMaximaRelativa;
	int alturaMaximaReal;
	
	Punto posicionInicial;
	Uint32 tiempoNacimiento;
	bool titilar;
	
	string nombre;
	
	vector<Animacion*> accionesParticulares;
	vector < pair< pair<int, int> , bool> > sonidos; // int : id, int : tipo, bool : esta sonando

public:

	Personaje(int x, int y, int maximoX, int maximoY, string nombre);
	virtual ~Personaje();
	
	//Setters atributos
	virtual void setEstado(int estado);
	void setMargenScroll(int margen);
	void setArmadura(bool estado);
	void setArma(bool estado);
	void setInvencibilidad(bool estado);
	void setVolatil(bool estado);
	void setAlturaEscalera(int altura);
	void setIdSonido(int idSonido, int sonido);
	Punto getPosicionInicial();
	void setAlturaMaximaRelativa();
	void setAlturaMaximaReal();

	// Getters atributos
	int getMargenScroll();
	EstadoMovimiento* getDirEstadoArriba();
	EstadoMovimiento* getDirEstadoAbajo();
	int getVidas();
	bool getArmadura();
	bool getArma();
	bool getVolatil();
	bool getInvencibilidad();
	int getAlturaEscalera();
	string getNombre();
	void setEstadoParticular(int estadoParticular);

	// Acciones
	virtual void Actualizar(Uint32 time);
	virtual int indexEstado(int estado);
	void restarVida();
	void aumentarVida();
	int getEstadoParticular();
	virtual void Morir();
	virtual void Saltar();
	void setPosicionInicial(int x, int y);
	virtual void MoverArriba(Uint32 deltaTime);
	virtual void MoverAbajo(int maximoX, Uint32 deltaTime);
	virtual void caer(Uint32 deltaTime, int maximoY);
	
	void StartSonido(int sonido);
	void StopSonido(int sonido);

	void SumarPuntos(int puntos);
	void RestarPuntos(int puntos);
	int getPuntaje();
	void ColisionarConPersonaje(Personaje* personaje, int colX, int colY);
	vector< pair<int, int> > getSonidos();
	
	void addAccionParticular(int idImagen, int cuadros);
	virtual pair<idImagen_t, int> getDibujable(Uint32 time, vector<ObjetoEstatico*> v_estaticos, vector<Obstaculo*> v_obstaculos, vector<ObjetoMovible*> v_movibles, ObjetoEstatico* princesa, vector<ObjetoMovible*> v_personajes);
	virtual pair<idImagen_t, int> getDibujable(Uint32 time);
	
	void Ganar();
	void Perder();
	bool Gano();
};

#endif /* PERSONAJE_H_ */
